ホームに戻る
出典 :
C# の統合言語クエリ (LINQ) | Microsoft Learn はじめてのLINQ - Qiita 【C#入門】LINQの使い方総まとめ - Samurai Blog LINQチートシート的なもの - Qiita ListからDictionary作る時もLINQを使おうぜ!ILookupも便利だぜ! #C# - Qiita
関連 :
クエリ式(select、from、where) [.NET]コレクション 無名関数とラムダ式 拡張メソッド DataTable
目次 :

LINQ (Language Integrated Query)とは

C# 3.0から導入された、オブジェクト、データベース、XMLなどのデータ集合に対して、クエリ(問い合わせ)を発行できる仕組みのこと。
集合に対する操作を、型によらない共通の手法で実現できる。

LINQ to Objects

IEnumerable<T> インタフェースを実装するすべてのオブジェクトに対してLINQが使用できる。
配列やコレクションなどのデータ列が該当し、これらは「シーケンス」と総称される。

基本的な例( Where() メソッド)

LINQを使用する際は、名前空間 System.Linq を参照する。
using System; using System.Collections.Generic; using System.Linq; //< LINQを使用する際に必要 : // シーケンス(List)の定義 var names = new List<string> { "Tokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Hong Kong", }; // クエリ : Where() メソッド // シーケンスから条件を満たす要素を抽出する IEnumerable<string> query = names.Where( s => s.Length <= 5 ); // クエリで抽出した部分集合に対する処理 foreach (var s in query) { Console.WriteLine(s); }
Where() メソッドの引数には、検索条件として
「引数(s)にシーケンス(names)の要素を与えた場合に true を返す」
ラムダ式を指定する。
ここでは、「文字列の長さが5以下の要素」がヒットする。
(上記のラムダ式は(s) => { return s.Length <= 5; }の省略。)
Where() の実行結果もまた IEnumerable<T> であるため、さらにクエリを実行することも可能である。メソッドチェーンも有効。

クエリ演算子

LINQが提供する Where() などのメソッドを「クエリ演算子」と呼ぶ。
これらは IEnumerable<T> に対する拡張メソッドとして定義されている。
クエリ演算子は多数存在するが、代表的なものを下表に示す。
クエリ演算子 機能 記述例
Where 条件に基づいてシーケンスをフィルタ処理する(条件に合致する要素を抽出する) names.Where( s => s.Length <= 5 )
(Length が5以下の要素を抽出)
Select シーケンスの各要素に指定された演算を施す(射影) names.Select( s => s.ToLower() )
(各要素を小文字に変換)
Count シーケンスの要素数を返す names.Count( s => s.Length <= 5 )
(Length が5以下の要素数を取得)

実用例

コレクションから Dictionary を生成する

ToDictionary() メソッドを用いる。
画像
新たに作成する Dictionary のキー、および値それぞれを規定するラムダ式を記述する。
ここで、ラムダ式の引数は基となるコレクションの要素( baseDic の要素である KeyValuePair )である。
KeyValuePair は Key でキー、Value で値を参照できる。
このように、コレクションから Dictionary への転写をループを用いることなく実現できる。
尚、ToDictionary() には複数のオーバーロードが存在する。詳細は割愛。

グループボックス内のチェックされたラジオボタンを取得する

画像
上記例において、groupBox1.Controls は「groupBox1 に含まれるすべてのコントロール」、
OfType<RadioButton>() メソッドにより、「RadioButton」に該当するもののみを抽出している。
ここまでの groupBox1.Controls.OfType<RadioButton>() がLINQの対象シーケンス(集合 : グループボックス内のラジオボタン)となる。
緑線がLINQの提供する Single() メソッドで、ラムダ式を満たす唯一のオブジェクトを結果として返す。

クエリ式との比較

LINQと同様、クエリ式でもクエリを実行することができる。
しかしクエリ式はSQLの知識が要求され、また記述も煩雑となりがちである。
LINQはクエリ式の弱点を補うべく開発された経緯から、よりプログラミング言語との親和性が高く、簡潔に記述できる利点がある。
逆にSQLに慣れているのであれば、クエリ式を用いることも選択肢となり得る。